const { render } = require("ejs");
const express = require("express");
const multer = require("multer");
const crypto = require("crypto"); //加密
const User = require("./model/user.js"); //调取数据库
const Shop = require("./model/shop");
const ShopCar = require("./model/shopcar");
const app = new express();

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads/");
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
    cb(null, uniqueSuffix + "-" + file.originalname);
  },
});
const upload = multer({ storage: storage });

app.set("view engine", "ejs"); //使用ejs模板引擎
app.use("/uploads", express.static("uploads")); //设置图片托管路径
app.use(express.static("public")); //设置托管路径
app.use(express.urlencoded()); //解决post传来数据格式问题
app.get("/", (req, res) => {
  res.send("welcome my world");
});

//进入注册页面
app.get("/register", (req, res) => {
  res.render("register");
});
// 处理注册
// 首先实现，检测用户名是否存在的接口
//可以根据数据库里已经存在的用户名，来进行重复不能注册的操作
app.post("/isRegister", async (req, res) => {
  console.log(req.body); //穿过来username
  const resultArr = await User.find(req.body); //从数据库里找值
  console.log(resultArr); //resultArr是一个数组
  //如果resultArr是空的话，就可以注册，否则就不能注册
  if (resultArr.length == 0) {
    res.json({
      code: 200,
      msg: "可以注册",
    });
  } else {
    res.json({
      code: 403,
      msg: "用户名已存在，不能注册",
    });
  }
});
app.post("/doRegister", async (req, res) => {
  // console.log(req.body);
  //对密码进行加密
  // hash.update(data) 指定要加密的内容（data）
  // hash.digest("hex") 指定加密的编码方式，可以为hex binary或者base64。
  let token = crypto.createHash("md5").update(req.body.password).digest("hex");
  // console.log(token);
  let obj = req.body;
  obj["token"] = token;
  console.log(obj);
  //把传来的数据，存入user这个数据库里面，当然token也要传入
  const user = new User(obj); //实例化user数据
  const result = await user.save(); //注册用户
  console.log(result);
  //判断是否插入数据成功
  if (result) {
    res.json({
      code: 200,
      msg: "注册成功",
      users: result,
    });
  }
});

// 进入到登录页面
app.get("/login", (req, res) => {
  res.render("login");
});
//实现用户登录接口
app.post("/doLogin", async (req, res) => {
  console.log(req.body);
  const result = await User.find(req.body); //从数据库里找值
  console.log(result);
  //如果数据库里存在我们输入的用户，就可以登录成功
  if (result != "") {
    res.json({
      code: 200,
      msg: "登录成功",
      users: result[0],
    });
  } else {
    res.json({
      code: 403,
      msg: "登录失败，请检查用户名或密码",
    });
  }
});

// 跳转到首页
app.get("/index", (req, res) => {
  res.render("index");
});
//显示商品列表的接口，是所有的用户上传的商品信息
app.get("/shopList", async (req, res) => {
  //实现分页效果
  const page = Number(req.query.page); //接收客户端传来的 page
  const limits = Number(req.query.limit); //接收穿过来的每页条数
  const start = (page - 1) * limits; // start 在数据库中查找数据时，要跳过几条进行查找
  const result = await Shop.find().skip(start).limit(limits); //从数据库里查找当页的数据
  const totalArr = await Shop.find(); //查找数据库里的所有数据
  res.json({
    code: 200,
    msg: "查询列表成功",
    data: result,
    total: totalArr.length,
  });
});

// 只显示用户自己添加的商品的页面，我的商品页面
app.get("/myshop", (req, res) => {
  res.render("myshop");
});
app.get("/myshoplist", async (req, res) => {
  //需要用到用户的uid，然后根据uid在数据库里查找
  console.log(req.query);
  //查找数据
  if (req.query.uid) {
    const result = await Shop.find(req.query);
    // console.log(result);
    if (result) {
      res.json({
        code: 200,
        msg: "商品信息获取成功",
        data: result,
      });
    }
  } else {
    res.json({
      code: 403,
      msg: "请检查是否登录",
    });
  }
});

//用户添加商品，要传入此用户的uid
//进入添加商品页面
app.get("/addshop", (req, res) => {
  res.render("addshop");
});
//写个接口，用来添加商品到数据库
app.post("/addmyshop", async (req, res) => {
  console.log(req.body); //接受客户端传来的数据
  // 要接收的数据有 uid,pimg,pname,price,pdesc
  //把传来的数据，存入shop这个数据库
  const shop = new Shop(req.body); //实例化shop数据
  const result = await shop.save(); //添加商品
  if (result) {
    res.json({
      code: 200,
      msg: "商品添加成功",
      result,
    });
  } else {
    res.json({
      code: 403,
      msg: "商品插入失败",
    });
  }
});

// 删除我的商品  动态传参/delShop/:uid,pid
app.delete("/delShop/:pid", async (req, res) => {
  console.log(req.params.pid);
  const pid = req.params.pid;
  const result = await Shop.findByIdAndDelete(pid); //根据id索引直接删除数据
  console.log(result);
  if (result) {
    res.json({
      code: 200,
      msg: "删除成功",
    });
  } else {
    res.json({
      code: 403,
      msg: "删除失败",
    });
  }
});

//进入到修改页面，修改商品信息
app.get("/editshop", (req, res) => {
  res.render("editshop");
});

// //根据pid获取到此商品详情信息
app.get("/doDetail/:pid", async (req, res) => {
  const pid = req.params.pid;
  // console.log(pid);
  //根据pid获取信息
  const result = await Shop.findById(pid);
  if (result) {
    res.json({
      code: 200,
      msg: "数据获取成功",
      data: result,
    });
  }
});

// 修改接口
app.put("/edit/:pid", async (req, res) => {
  const pid = req.params.pid;
  const result = await Shop.findByIdAndUpdate(pid, req.body); //相当于根据pid，替换更新里面的内容
  if (result) {
    res.json({
      code: 200,
      msg: "数据修改成功",
    });
  }
});

app.post("/profile", upload.single("avatar"), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  console.log("文件上传");
  console.log(req.file);
  res.json({
    code: 200,
    msg: "图片上传成功",
    path: req.file.path,
  });
});

// 进入到商品详情页
app.get("/shopdetail", (req, res) => {
  res.render("shopdetail");
});

//查看购物车
app.get("/shopcar", (req, res) => {
  res.render("shopcar");
});
//添加商品到购物车的数据库
// 需要uid，pid，pname，pprice，pdesc，pimg
app.post("/addToCar", async (req, res) => {
  //如果购物车里已经有这个商品(uid，pid)
  console.log(req.body);
  let isitObj = { uid: req.body.uid, pid: req.body.pid }; //定义一个存放pid和uid的数组
  const findItArr = await ShopCar.find(isitObj);
  console.log(findItArr); //如果findItArr是空的，就把此商品加入数据库
  if (findItArr.length == 0) {
    const car = new ShopCar(req.body); //实例化shop数据
    const result = await car.save(); //添加商品到购物车
    if (result) {
      res.json({
        code: 200,
        msg: "成功加入购物车",
        data: result,
      });
    } else {
      res.json({
        code: 403,
        msg: "添加失败",
      });
    }
  } else {
    //否则的话，就直接更新商品数量num
    console.log(findItArr[0].num); //获取数量
    let nowNum = Number(findItArr[0].num); //原来的数量
    let addNum = Number(req.body.num); //现在加入的数量
    const result2 = await ShopCar.updateOne(
      { num: nowNum },
      { num: nowNum + addNum }
    );
    if (result2) {
      res.json({
        code: 200,
        msg: "数量更新成功",
      });
    } else {
      res.json({
        code: 403,
        msg: "添加失败",
      });
    }
  }
});

//获取用户的购物车列表，根据此用户的uid，从shopcar数据集合中找到数据
app.get("/carList/", async (req, res) => {
  console.log(req.query);
  const result = await ShopCar.find(req.query);
  if (result) {
    res.json({
      code: 200,
      msg: "购物车更新成功",
      data: result,
    });
  }
});

//删除购物车中我添加的商品
//thisId相当于数据库中本条商品的_id
app.delete("/delCarShop/:thisId", async (req, res) => {
  console.log(req.params.thisId);
  const thisId = req.params.thisId;
  const result = await ShopCar.findByIdAndDelete(thisId); //根据id索引直接删除数据
  console.log(result);
  if (result) {
    res.json({
      code: 200,
      msg: "删除成功",
    });
  } else {
    res.json({
      code: 403,
      msg: "删除失败",
    });
  }
});

//更新商品数量，在购物车中更新
//需要这个商品的_id，然后在数据库中找到后，直接把num改了
app.post("/changeNum", async (req, res) => {
  console.log(req.body);
  let updataNum = req.body.num; //要更改的数量
  const result = await ShopCar.updateOne(
    { _id: req.body.thisId },
    { num: updataNum }
  ); //把_id为thisId的数据里，num改变成 现在传过来的 _id
  if (result) {
    res.json({
      code: 200,
      msg: "修改数量成功",
    });
  }
});

app.listen(8888);
